package fr.miage.shopping.dao.traitements;

import fr.miage.shopping.metier.entite.Admin;
import fr.miage.shopping.metier.entite.Categorie;
import fr.miage.shopping.metier.entite.Client;
import fr.miage.shopping.metier.entite.Commande;
import fr.miage.shopping.metier.entite.Lignecommande;
import fr.miage.shopping.metier.entite.Produit;
import fr.miage.shopping.metier.entite.Role;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;



/**
 * @author kristela
 *
 */
public class RoleDao {


	/**
	 * Retourne une session.
	 * 
	 * @return la session.
	 */
	public static Session getSession() {
		Configuration config = new Configuration();
		config.addClass(Client.class);
		config.addClass(Commande.class);
		config.addClass(Lignecommande.class);
		config.addClass(Produit.class);
		config.addClass(Admin.class);
		config.addClass(Categorie.class);
		config.addClass(Role.class);
		SessionFactory sessionFactory = config.buildSessionFactory();
		Session session = sessionFactory.openSession();
		return session;
	}

    /**
     * Sélectionner tous les rôles
     * @return liste de rôle
     */
    public static List<Role> getAllRole() {
        List<Role> laListe = new ArrayList<Role>();
        Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
            Criteria criteria = session.createCriteria(Role.class);
            laListe = criteria.list();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
        return laListe;
	}


	/**
	 * Ajoute un nouveau role dans la base de donnees.
	 * 
	 * @param role
	 *            le admin a ajouter.
	 */
	public static void insertRole(Role role) {
		Session session = getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Transaction tx = null;
		try {
			tx = session.beginTransaction();
			session.save(role);
            tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			session.close();
		}

		session.getSessionFactory().close();
	}

    /**
     * Sélectionne le role
     * @param role
     * @return le role
     */
	public static Role selectRole(Role role){
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		Role rLoad= new Role();
		session.load(rLoad, role.getRole());
		session.close();
		session.getSessionFactory().close();
		return rLoad;
	}

	/**
	 * Renvoie la liste de touts les admins.
	 * 
	 * @return tous les admins.
	 */
	public static List<Role> selectAllRole() {
		List<Role> listRole = new ArrayList<Role>();
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}
		listRole=(List<Role>)session.createQuery("Select r from Role r").list(); 
		session.close();
		session.getSessionFactory().close();
		return listRole;
	}

	/**
	 * Effacer le compte epargne correspondant a un numero.
	 * 
	 * @param numero
	 *            le numero du compte.
	 */
	public static void deleteRole(Role role) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.delete(role);
		}
		session.close();
		session.getSessionFactory().close();
	}
	
	public static void updateRole(Role role) {
		Session session=getSession();
		if (session == null) {
			System.out.println("Pas de connexion!");
			System.exit(0);
		}else{
			session.update(role);
		}
		session.close();
		session.getSessionFactory().close();
	}
	
	public static String getRoleCritere(Role role){
		StringBuffer sql=new StringBuffer("SELECT FROM role ");
		if (role.getRole()!=null || role.getDescription()!=null) {
			sql.append("WHERE ");
			if (role.getRole()!=null && role.getDescription()!=null) {
				sql.append(" role=\""+role.getRole()+"\" AND description=\""+role.getDescription()+"\" ");
			}else
				if (role.getRole()==null) {
					sql.append("description=\""+role.getDescription()+" ");
				}else{
					sql.append("role=\""+role.getRole()+"\" ");
				}
		}
		sql.append(";");
		return sql.toString();
	}
}
